/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package mira.org.controladores;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.ejb.EJBException;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import mira.org.beans.AgendaFacade;
import mira.org.beans.AntecedentesFacade;
import mira.org.beans.PacientesFacade;
import mira.org.controladores.util.JsfUtil;
import mira.org.entidades.Agenda;
import mira.org.entidades.Antecedentes;
import mira.org.entidades.Cita;
import mira.org.entidades.Pacientes;

/**
 *
 * @author paul
 */
@ManagedBean(name = "wizarPacienteControlador")
@SessionScoped
public class WizarPacienteControlador implements Serializable {

    @EJB
    private mira.org.beans.PacientesFacade ejbPacienteFacade;
    @EJB
    private mira.org.beans.AntecedentesFacade ejbAntecedenteFacade;
    @EJB
    private mira.org.beans.AgendaFacade ejbAgendaFacade;

    private Pacientes paciente;

    private Antecedentes antecendente;

    private Agenda agenda;
    
    private Cita cita;
    
    private Date date;

    private List<Pacientes> items = null;

    public Pacientes getPaciente() {
        return paciente;
    }

    public void setPaciente(Pacientes paciente) {
        this.paciente = paciente;
    }

    public Antecedentes getAntecendente() {
        return antecendente;
    }

    public void setAntecendente(Antecedentes antecendente) {
        this.antecendente = antecendente;
    }

    public Agenda getAgenda() {
        return agenda;
    }

    public void setAgenda(Agenda agenda) {
        this.agenda = agenda;
    }
    
    public Cita getCita() {
        return cita;
    }

    public void setCita(Cita cita) {
        this.cita = cita;
    }

    public PacientesFacade getEjbPacienteFacade() {
        return ejbPacienteFacade;
    }

    public AntecedentesFacade getEjbAntecedenteFacade() {
        return ejbAntecedenteFacade;
    }

    public AgendaFacade getEjbAgendaFacade() {
        return ejbAgendaFacade;
    }
    
    /**
     * metodo que captura la fecha del sistema 
     * @return  se retorna un dato tipo Date
     */
    public Date getDate() {
        date = new Date();
        return date;
    }

    /**
     * Metodo donde se crea la instancia para las clases paciente, antecedentes,
     * agenda
     *
     * @return String con la ruta hacia el wizard de crear paciente
     */
    public String prepareWizardCreate() {
        paciente = new Pacientes();
        antecendente = new Antecedentes();
        agenda = new Agenda();
        return "WizardPaciente";
    }

    /**
     * Metodo donde se entrega el id de pacioente para las clases que se
     * encuentran relacionadas con el paciente y adicionalmente se captura la
     * fecha del sistema para la clade de antecedente
     */
    public void definirIdPaciente() {
        agenda.setIdpaciente(paciente);
        antecendente.setIdpaciente(paciente);
        antecendente.setFechacreacion(getDate()); // se captura la fecha del sistema

    }

    /**
     * se refresca la tabla
     */
    private void recreateModel() {
        items = null;
    }

    /**
     * Metodo que realiza el llamdo del metodo recreateModel
     *
     * @return String con la direcion desde la raiz para la pagina de listar
     * pacientes
     */
    public String prepareList() {
        recreateModel();
        return "/wizar/WizarListPaciente";
    }

    /**
     * Metodo que almazena la informacion capturado del wizard
     *
     * @return String con la direccion de la pagina de listar paciente
     */
    public String almacenarWizard() {
        definirIdPaciente();
        try {
            if (getPaciente() != null && getAntecendente() != null && getAgenda() != null) {
                getEjbPacienteFacade().create(paciente);
                getEjbAntecedenteFacade().create(antecendente);
                getEjbAgendaFacade().create(agenda);
            }
            JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/Bundle").getString("PacientesCreated"));
        } catch (EJBException ex) {
            String msg = "";
            Throwable cause = ex.getCause();
            if (cause != null) {
                msg = cause.getLocalizedMessage();
            }
            if (msg.length() > 0) {
                JsfUtil.addErrorMessage(msg);
            } else {
                JsfUtil.addErrorMessage(ex, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
            }
        } catch (Exception ex) {
            Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, null, ex);
            JsfUtil.addErrorMessage(ex, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
        }

        recreateModel();
        return "WizarListPaciente";
    }

    /**
     * Metodo que elemina el Item seleccionado y a su vez actualiza los mensajes
     */
    public void eliminiarWizard() {
        if (paciente != null) {
            try {
                ejbPacienteFacade.remove(paciente);
                paciente = null; // Remove selection
                items = null;    // Invalidate list of items to trigger re-query.
                JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/Bundle").getString("PacientesDeleted"));
            } catch (EJBException ex) {
                String msg = "";
                Throwable cause = ex.getCause();
                if (cause != null) {
                    msg = cause.getLocalizedMessage();
                }
                if (msg.length() > 0) {
                    JsfUtil.addErrorMessage(msg);
                } else {
                    JsfUtil.addErrorMessage(ex, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
                }
            } catch (Exception ex) {
                Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, null, ex);
                JsfUtil.addErrorMessage(ex, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
            }
        }
    }

    /**
     * metodo donde se raliza la busqueda de todos los paciente
     *
     * @return paciente con el listado de todos los pacientes
     */
    public List<Pacientes> getItems() {
        if (items == null) {
            items = getEjbPacienteFacade().findAll();
        }
        return items;
    }

    /**
     * metodo que realiza la carga de los datos para agenda y antecedentes de
     * acuerdo al id de paciente
     *
     * @return String con la direccion de la pagina para editar
     */
    public String prepareEdit() {
        agenda = ejbAgendaFacade.getAgendaPaciente(getPaciente().getIdpaciente());
        antecendente = ejbAntecedenteFacade.getAntecedentesPaciente(getPaciente().getIdpaciente());
        return "WizarEditarPaciente";
    }
    
    /**
     * metodo que permita la edicion de los datos de paciente 
     * agenda y antecedente 
     * @return String con la direccion de la lista de paciente
     */
    public String editarWizard() {
        try {
            if (getPaciente() != null && getAntecendente() != null && getAgenda() != null) {
                getEjbPacienteFacade().edit(getPaciente());
                getEjbAntecedenteFacade().edit(getAntecendente());
                getEjbAgendaFacade().edit(getAgenda());
            }
            JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/Bundle").getString("PacientesUpdated"));
        } catch (EJBException ex) {
            String msg = "";
            Throwable cause = ex.getCause();
            if (cause != null) {
                msg = cause.getLocalizedMessage();
            }
            if (msg.length() > 0) {
                JsfUtil.addErrorMessage(msg);
            } else {
                JsfUtil.addErrorMessage(ex, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
            }
        } catch (Exception ex) {
            Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, null, ex);
            JsfUtil.addErrorMessage(ex, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
        }

        recreateModel();
        return "WizarListPaciente";
    }
       
}
